home *** CD-ROM | disk | FTP | other *** search
/ Power Programmierung / Power-Programmierung (Tewi)(1994).iso / fortran / mslang / fiolib / fiolib.c < prev    next >
C/C++ Source or Header  |  1993-07-07  |  3KB  |  140 lines

  1. /******************************************************************************\
  2.  *
  3.  *    Module: FIOLib.C
  4.  *
  5.  *    Purpose: Library of functions to handle Fortran formatted files.
  6.  *
  7.  *    Copyright (c) 1993 by David Cook
  8.  *
  9.  *    Permission to use, copy, and distribute this software and its
  10.  *    documentation for any purpose with or without fee is hereby granted, 
  11.  *    provided that the above copyright notice appears in all copies and 
  12.  *    that both that copyright notice and this permission notice appear 
  13.  *    in supporting documentation.
  14.  *
  15.  *    Permission to modify the software is granted, but not the right to
  16.  *    distribute the modified code.  Modifications are to be distributed 
  17.  *    as patches to released version.
  18.  *
  19.  *    This software is provided "as is" without express or implied warranty.
  20.  *
  21.  *    David Cook
  22.  *    Dave Cook Consulting
  23.  *    206-230-0239
  24.  *    CIS 72124,3725
  25.  *
  26.  *    Revision History:
  27.  *
  28.  *    24-Jun-93    D. Cook
  29.  *        Original version.
  30.  *
  31. \******************************************************************************/
  32.  
  33. #include    <stdio.h>
  34. #include    <fcntl.h>
  35. #include    <sys\types.h>
  36. #include    <sys\stat.h>
  37. #include    <io.h>
  38. #include    "fiolib.h"
  39.  
  40. #ifndef    TRUE
  41. #define    FALSE    0
  42. #define    TRUE    !FALSE
  43. #endif
  44.  
  45. static int    first = TRUE ;
  46. static int    bufcnt = 0,
  47.         bufidx = 0 ;
  48.  
  49.  
  50. /******************************************************************************\
  51.  *
  52.  *    Function to initialize for I/O
  53.  *
  54. \******************************************************************************/
  55.  
  56. /* Function */ void ForRewind()
  57.  
  58. {
  59.     first = TRUE ;
  60.     bufcnt = bufidx = 0 ;
  61. }
  62.  
  63. /******************************************************************************\
  64.  *
  65.  *    Function to fetch data item from an unformatted record
  66.  *
  67. \******************************************************************************/
  68.  
  69. static char    buf[128] ;
  70.  
  71. /* Function */ int ForGetData ( int fd, char bp[], int size )
  72.  
  73. {
  74.     int    cnt ;
  75.  
  76.     for ( cnt = 0 ; cnt < size ; cnt++ )
  77.     {
  78.         if ( bufidx >= bufcnt )
  79.         {
  80.         if ( ForGetBuf ( fd ) == EOF )
  81.             return ( EOF ) ;
  82.         }
  83.         bp[cnt] = buf[bufidx++] ;
  84.     }
  85.     return ( cnt ) ;
  86.  
  87. }
  88.  
  89. /******************************************************************************\
  90.  *
  91.  *    Function to load a buffer of data from an unformatted file
  92.  *
  93. \******************************************************************************/
  94.  
  95. static unsigned char    RecHead, RecTail ;    // Record Size: BOR, EOR
  96. #define    BOF_MARK    75
  97. #define    EOF_MARK    130
  98. #define    MULTIREC    129        // Multiple record mark
  99.  
  100.  
  101. /* Function */ int ForGetBuf ( int fd )
  102.  
  103. {
  104.     if ( first )
  105.     {
  106.         read ( fd, &RecHead, 1 ) ;
  107.         if ( RecHead != BOF_MARK )
  108.         {
  109.         fprintf ( stderr, "GetBuf - BOF mark mismatch.\n" ) ;
  110.         return ( EOF ) ;
  111.         }
  112.         first = FALSE ;
  113.     }
  114.  
  115.     read ( fd, &RecHead, 1 ) ;
  116.     switch ( RecHead )
  117.     {
  118.         case EOF_MARK:
  119.         return ( EOF ) ;
  120.  
  121.         case MULTIREC:
  122.         read ( fd, buf, 128 ) ;
  123.         bufcnt = 128 ;
  124.         break ;
  125.  
  126.         default:
  127.         read ( fd, buf, RecHead ) ;
  128.         bufcnt = RecHead ;
  129.     }
  130.     read ( fd, &RecTail, 1 ) ;
  131.     if ( RecTail != RecHead )
  132.     {
  133.         fprintf ( stderr, "GetBuf - BOR != EOR\n" ) ;
  134.         return ( EOF ) ;
  135.     }
  136.     bufidx = 0 ;
  137.     return ( RecHead ) ;
  138.  
  139. }
  140.